package com.lab.dto;

import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

/**
 * 实验室成员DTO（数据传输对象）
 * 用于创建或更新实验室成员信息时的数据传输，对应member表的核心业务字段
 */
@Data
public class MemberDTO {

    /**
     * 成员唯一标识（主键ID）
     * 新增时无需传入（数据库自增），更新时必须传入（用于定位要修改的记录）
     */
//    @NotBlank(message = "更新时成员ID不能为空") // 仅更新时校验非空
//    @Size( message = "成员ID必须为正整数") // 确保ID合法（数据库自增ID从1开始）
    private Integer id;

    /**
     * 成员姓名
     * 不可为空，建议长度限制在1-50字符（与数据库字段varchar(50)匹配）
     */
    @NotBlank(message = "成员姓名不能为空")
    @Size(max = 50, message = "姓名长度不能超过50个字符")
    private String name;

    /**
     * 年级
     * 不可为空，格式通常为"2021级"、"研一"等，长度限制在20字符内
     */
    @NotBlank(message = "年级不能为空")
    @Size(max = 20, message = "年级描述不能超过20个字符")
    private String grade;

    /**
     * 专业
     * 不可为空，如"计算机科学与技术"，长度限制在50字符内
     */
    @NotBlank(message = "专业不能为空")
    @Size(max = 50, message = "专业名称不能超过50个字符")
    private String major;

    /**
     * 学号
     * 不可为空且唯一（数据库有uk_member_student_id约束），建议按学校学号规则校验格式
     */
    @NotBlank(message = "学号不能为空")
    @Pattern(regexp = "^[0-9A-Za-z]{5,20}$", message = "学号格式不符合要求（5-20位数字或字母）")
    private String studentId;

    /**
     * 角色类型
     * 不可为空，限定为预设的角色（如前端、后端、算法等），避免非法值
     */
    @NotBlank(message = "角色类型不能为空")
    @Pattern(regexp = "^(前端|后端|)$", message = "角色类型只能是前端、后端")
    private String roleType;

    /**
     * 是否请假
     * 不可为空，限定值为0（否）或1（是），与数据库字段逻辑保持一致
     */
    @NotBlank(message = "是否请假状态不能为空")
    @Pattern(regexp = "^(0|1)$", message = "是否请假状态只能是0（否）或1（是）")
    private Integer isOnLeave;

    /**
     * 密码（明文传输，后端需加密存储）
     * 不可为空，需符合密码强度要求（示例：8-20位，包含字母和数字）
     */
    @NotBlank(message = "密码不能为空")
    @Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d).{8,20}$", message = "密码需8-20位，且包含字母和数字")
    private String password;

    /**
     * 登录角色（限定为管理员、学生、老师）
     * 不可为空，且必须是指定的角色值
     */
    @NotBlank(message = "角色不能为空")
    @Pattern(regexp = "^(admin|student|teacher)$", message = "角色必须是 admin、student 或 teacher")
    private String role;
}